home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / vbdatabs / llist.cpp < prev    next >
C/C++ Source or Header  |  1999-03-17  |  3KB  |  119 lines

  1. // ------------------------------- //
  2. // -------- Start of File -------- //
  3. // ------------------------------- //
  4. // ----------------------------------------------------------- // 
  5. // C++ Source Code File Name: llist.cpp 
  6. // Compiler Used: MSVC40, DJGPP 2.7.2.1, GCC 2.7.2.1, HP CPP 10.24
  7. // Produced By: Doug Gaer 
  8. // File Creation Date: 04/05/1996 
  9. // Date Last Modified: 03/17/1999
  10. // ----------------------------------------------------------- // 
  11. // ------------- Program Description and Details ------------- // 
  12. // ----------------------------------------------------------- // 
  13. /*
  14. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
  15. THE ENTIRE RISK OF THE QUALITY AND PERFORMANCE OF THIS SOFTWARE
  16. IS WITH YOU. SHOULD ANY ELEMENT OF THIS SOFTWARE PROVE DEFECTIVE,
  17. YOU WILL ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
  18. CORRECTION.
  19.  
  20. Simple doubly linked list implementation.
  21. */
  22. // ----------------------------------------------------------- // 
  23. #include "llist.h"
  24.  
  25. void LList::Store(listTYPE info)
  26. {
  27.   LListB *prt;
  28.  
  29.   // Allocate memory for info elements 
  30.   prt = new LListB;
  31.  
  32.   // Copy info elements into non-contiguous memory
  33.   prt->info = info;
  34.  
  35.   if(Start == 0) {
  36.     // First element in list
  37.     End = Start = prt;
  38.   }
  39.   else {
  40.     // Put element on the end of the list
  41.     prt->Prior = End;
  42.     End->Next = prt;
  43.     End = prt;
  44.   }
  45. }
  46.  
  47. void LList::Remove(LListB *ptr)
  48. // Detach node and remove it from memory.
  49. {
  50.   Detach(ptr);
  51.   delete ptr;
  52. }
  53.  
  54. LListB *LList::Detach(LListB *ptr)
  55. // Detaches a node from the list.
  56. // Returns a pointer to the detached node.
  57. {
  58.   if(ptr->Prior) { // Not deleting first element
  59.     ptr->Prior->Next = ptr->Next;
  60.     if(ptr->Next) // Not deleting last element
  61.       ptr->Next->Prior = ptr->Prior;
  62.     else // Otherwise, we are deleting last element
  63.       End = ptr->Prior; // Update end pointer
  64.   }
  65.   else { // Deleting first element
  66.     if(ptr->Next) { // List not empty
  67.       ptr->Next->Prior = 0;
  68.       Start = ptr->Next;
  69.     }
  70.     else // List is now empty
  71.       Start = End = 0;
  72.   }
  73.  
  74.   return ptr;
  75. }
  76.  
  77. LListB *LList::Find(listTYPE info)
  78. // Find a specifed node. This functions assumes that
  79. // listTYPE has its == operator defined.
  80. {
  81.   for(LListB *prt = Start; prt; prt = prt->GetNext())
  82.     if(prt->info == info) return prt; // Found the item
  83.  
  84.   // Return a NULL if the item is not found
  85.   return 0;
  86. }
  87.  
  88. int LList::RmvData(listTYPE info)
  89. // Remove Data starting from the head from the list, and set
  90. // next node as the head.
  91. {
  92.   if (Start) {
  93.      info = Start->info;
  94.      LListB *ptr = Start;
  95.      Start = Start->Next;
  96.      delete ptr;
  97.      return 1;
  98.   }
  99.   else return 0;
  100. }
  101.  
  102. void LList::Clear()
  103. {
  104.   // Remove all nodes from the list.
  105.   listTYPE dmy;
  106.   int r;
  107.  
  108.   do {
  109.     r = RmvData(dmy);
  110.   } while(r);
  111.  
  112.   // Reset the Start and End pointers
  113.   Start = End = 0;
  114. }
  115. // ----------------------------------------------------------- // 
  116. // ------------------------------- //
  117. // --------- End of File --------- //
  118. // ------------------------------- //
  119.